package top.zhouze.common.util;

import lombok.SneakyThrows;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author 周仄
 * @since 2024/5/11 下午5:12
 */
public class BeanUtil {

    @SneakyThrows
    public static <T>T toBean(Object source, Class<T> targetClass) {
        T t = targetClass.getDeclaredConstructor().newInstance();
        copyProperties(source,t);
        return t;
    }

    public static void copyProperties(Object source, Object target) {
        try {
            // 获取源Bean的Class对象
            Class<?> sourceClass = source.getClass();
            // 获取目标Bean的Class对象
            Class<?> targetClass = target.getClass();

            // 获取源Bean的属性列表
            Field[] sourceFields = sourceClass.getDeclaredFields();

            for (Field sourceField : sourceFields) {
                // 获取属性名
                String fieldName = sourceField.getName();
                // 构造Getter和Setter方法的名字
                String getterMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                String setterMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);

                try {
                    // 获取源Bean的属性值
                    Method getterMethod = sourceClass.getDeclaredMethod(getterMethodName);
                    Object value = getterMethod.invoke(source);

                    // 获取目标Bean的Setter方法
                    Method setterMethod = targetClass.getDeclaredMethod(setterMethodName, sourceField.getType());
                    // 调用目标Bean的Setter方法，将源Bean的属性值复制过去
                    setterMethod.invoke(target, value);
                } catch (Exception ignored) {}
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
